package main

import (
	"fmt"
	"reflect"
)

func reflectValue(x interface{}) {
	// var num = 10  + x  // 这里会报错，因为x是interface{}类型，不能直接与数字相加
	b, _ := x.(int) //类型断言，将x转换为int类型
	var num = 10 + b
	fmt.Println(num)

	// 通过反射
	v := reflect.ValueOf(x)
	fmt.Println(v) // 输出13
	var n = v.Int() + 12  // v.Int() 获取int类型的原始值
	fmt.Println(n) // 输出25
}

func GetVal(x interface{}) {
	v := reflect.ValueOf(x)
	// v.Kind() 获取值的类型
	kind := v.Kind()

	switch kind {
	case reflect.Int:
		fmt.Printf("int类型的原始值：%d\n", v.Int())
	case reflect.Float64:
		fmt.Printf("float64类型的原始值：%f\n", v.Float())
	case reflect.String:
		fmt.Printf("string类型的原始值：%s\n", v.String())
	case reflect.Bool:
		fmt.Printf("bool类型的原始值：%t\n", v.Bool())
	default:
		fmt.Println("unknown type")
	}
}

func main() {
	var a = 13
	reflectValue(a)
	GetVal(a)

	var b = "hello world"
	GetVal(b)	
	var c = true
	GetVal(c)
	var d = 3.14
	GetVal(d)
}